<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        //  FUNCTION实例的 bind() 方法创建一个新函数，当调用该新函数时，
        //  它会调用原始函数并将其 this 关键字设置为给定的值，
        //  同时，还可以传入一系列指定的参数，这些参数会插入到调用新函数时传入的参数的前面。
        
        var obj = {
            name: '猪脚饭'
        }

        function func (num1, num2, num3, num4) {
            console.log(this, num1, num2, num3, num4)
            return num1 + num2 + num3 + num4
        }

        Function.prototype.myBind = function (ctx) {
            var args = Array.prototype.slice.call(arguments, 1)
            var fn = this
            return function A () {
                var resetArgs = Array.prototype.slice.call(arguments)
                var allArgs = args.concat(resetArgs)
                if (Object.getPrototypeOf(this) === A.prototype) {
                    return new fn(...allArgs)
                }
                else {
                    return fn.apply(ctx, allArgs)
                }
            }
        }

        var res = func.myBind(obj, 1, 2)
        console.log(res(4,5))
    </script>
</body>
</html>